/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package WebBrowser_Cores;

import WebBrowser_Cores.Utils;
import WebBrowser_Cores.ScanWebbrowser;
import WebbrowserUtils.Xpath;
import com.sun.xml.internal.txw2.Document;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 *
 * @author Administrator
 */
public class QuetThongTin implements ScanWebbrowser, Utils {

    String m_strHtml = "";

    public QuetThongTin() {
    }

    public QuetThongTin(String html) {
        this.m_strHtml = html;
    }

    /**
     * Lấy thông tin trên trang vnexpress phần thông tin thế giới và insert vào
     * CSDL
     */
    public void ScanVNEXPRESS() {
        try {
            if (m_strHtml.trim().length() == 0 || m_strHtml.trim() == null) {
                return;
            }
            org.jsoup.nodes.Document doc = Jsoup.parse(m_strHtml);
            //B1: lấy danh sách các node <div class="folder-news">
            Elements danhsachTagDiv = null;
            try {
                danhsachTagDiv = doc.select("div.folder-news");
            } catch (Exception ex) {
            }
            if (danhsachTagDiv.size() > 0 && danhsachTagDiv != null) {
                for (Element item : danhsachTagDiv) {
                    String noidungTag = item.html();
                    Element node = item.parent();
                }
            }
            //B2: ứng với từng node ta lấy nội dung của nó rồi insert vào CSDL

            //B3: quét tiếp trang tiếp theo và thực hiện lại bước 2
        } catch (Exception ex) {
            String loi = ex.getMessage();
        }
    }

    /**
     * Lấy thông tin trên báo công an phần tin thế giới và insert vào CSDL
     */
    public void ScanCONGAN() {
        try {
            if (m_strHtml.trim().length() == 0 || m_strHtml.trim() == null) {
                return;
            }
        } catch (Exception ex) {
        }
    }

    /**
     * Lấy thông tin trên trang báo tuổi trẻ và insert vào CSDL
     */
    public void ScanTUOITRE() {
        try {
            if (m_strHtml.trim().length() == 0 || m_strHtml.trim() == null) {
                return;
            }
        } catch (Exception ex) {
        }
    }

    //<editor-fold desc="Lấy thông tin 1 Tag khi biết XPath">
    /**
     * Lấy thông tin tag từ xpath
     *
     * @param html nội html vừa lấy được
     * @param xpath nội dung Xpath cần lấy
     * @return nội dung Tag
     */
    @Override
    public List<String> GetContentTagFromXpath(String html, String xpath) {
        List<String> listResult = new ArrayList<>();
        try {
            //Lay noi dung Xpath
            List<Xpath> listXpath = LayNoiDungXpath(xpath);
            //kiểm tra Xpath có hợp lệ hay không.
            //kiểm tra Xpath có hợp lệ hay không.
            if (!KiemTraXpathHopLe(listXpath)) {
                return listResult;
            }

            //kiểm tra XPath có phải là multi hay không.
            if (KiemTraXpathMulti(listXpath)) {
                listResult = TimDSNoiDung(html, listXpath);
            } else {
                String strResult = TimNoiDung(html, listXpath);
                listResult.add(strResult);
            }

        } catch (Exception ex) {
        }
        return listResult;
    }
    //</editor-fold>

    //<editor-fold desc="Lấy nội dung Xpath">
    private List<Xpath> LayNoiDungXpath(String _xpath) {
        List<Xpath> listResult = new ArrayList<Xpath>();
        try {
            //////*[@id="content"]/div[1]/div[2]/div[1]
            String[] listtemp = _xpath.split("/");
            if (listtemp.length > 0) {
                for (String sitem : listtemp) {
                    if (sitem.trim().length() > 0) {
                        listResult.add(ChuyenVeDoiTuongXpath(sitem));
                    }
                }
            }
        } catch (Exception ex) {
        }
        return listResult;
    }
    //</editor-fold>

    //<editor-fold desc="chuyển tên thuộc tính thành đối tượng xpath">
    /**
     * chuyển tên thuộc tính thành đối tượng xpath
     *
     * @param sitem
     * @return
     */
    private Xpath ChuyenVeDoiTuongXpath(String sitem) {
        Xpath Result = null;
        try {
            //kiểm tra xem có dấu sao hay không, nếu có là thuộc tính.
            if (sitem.indexOf("*") > -1) {
                Result = new Xpath();
                Result.setSoLuong(1);
                Result.setisTag(false);
                int ipositonA = sitem.indexOf("@");

                //<editor-fold desc="Lay ten attributes">
                if (ipositonA > -1) {
                    int ipositionA_end = sitem.indexOf("=");
                    if (ipositionA_end > -1) {
                        String tenthuoctinh = sitem.substring(ipositonA + 1, ipositionA_end);
                        Result.setTenTag(tenthuoctinh.trim());
                    }
                }
                //</editor-fold>

                //<editor-fold desc="Lay noi dung Attributes">
                int ipositionAttrName = sitem.indexOf("\"");
                if (ipositionAttrName > -1) {
                    int ipositionAttrName_end = sitem.lastIndexOf("\"");
                    if (ipositionAttrName_end > -1) {
                        String temp = sitem.substring(ipositionAttrName + 1, ipositionAttrName_end);
                        if (temp.trim().length() > 0) {
                            Result.setTenThuocTinh(temp.trim());
                        }
                    }
                }
                //</editor-fold>
            } else {
                //đây là tên các tag
                Result = new Xpath();
                Result.setisTag(true);
                int iposition = sitem.indexOf("[");
                int ipositionN = sitem.indexOf("-");
                if (ipositionN > 0) {
                    Result.setQuetNhieuTag(true);

                } else {
                    Result.setQuetNhieuTag(false);
                }
                if (iposition > 0) {
                    String temp = sitem.substring(0, iposition);
                    if (temp.trim().length() > 0) {
                        Result.setTenTag(temp.trim());
                    }

                    int iposition_end = -1;
                    if (Result.isQuetNhieuTag()) {
                        iposition_end = sitem.indexOf("-");
                    } else {
                        iposition_end = sitem.lastIndexOf("]");
                    }

                    if (iposition_end > -1) {
                        if (Result.isQuetNhieuTag()) {
                            if (sitem.lastIndexOf("-n") > -1) {
                                //quét đến n tag
                                Result.setTagMax(100);//nếu =-1 thì quét tất cả
                            } else {
                                //n là 1 số cụ thể.
                                int sl = 0;
                                try {
                                    sl = Integer.parseInt(sitem.substring(iposition_end + 1, sitem.lastIndexOf("]")));
                                } catch (Exception ex) {
                                }
                                if (sl > 0) {
                                    Result.setTagMax(sl);
                                }
                            }
                        }
                        String i_temp = sitem.substring(iposition + 1, iposition_end);
                        if (i_temp.trim().length() > 0) {
                            int sl = Integer.parseInt(i_temp.trim());
                            Result.setSoLuong(sl);
                            if (Result.isQuetNhieuTag()) {
                                Result.setTagMin(sl);
                            }
                        }
                    }

                } else {
                    Result.setTenTag(sitem.trim());
                    Result.setSoLuong(1);
                }
            }
        } catch (Exception ex) {
        }
        return Result;
    }
//</editor-fold>

    //<editor-fold desc="Tìm nội dung của trang thong qua xpath">
    /**
     * Tìm nội dung của trang thong qua xpath
     *
     * @param html
     * @param listXpath
     * @return
     */
    private String TimNoiDung(String html, List<Xpath> listXpath) {
        String strResult = null;
        try {

            org.jsoup.nodes.Document doc = Jsoup.parse(html);
            Elements Result = null;
            for (Xpath item : listXpath) {
                if (!item.getisTag()) {
                    Result = doc.getElementsByAttributeValue(item.getTenTag(), item.getTenThuocTinh()).get(item.getSoLuong() - 1).children();
                } else {
                    Result = Result.get(item.getSoLuong() - 1).children();
                }
                strResult = Result.outerHtml();
            }
            strResult = Result.outerHtml();


        } catch (Exception ex) {
        }
        return strResult;
    }

    /**
     * Lấy danh sách các nội dung TAG
     *
     * @param html
     * @param listXpath Xpath là multi
     * @return
     */
    private List<String> TimDSNoiDung(String html, List<Xpath> listXpath) {
        List<String> listResult = new ArrayList<>();
        try {
            org.jsoup.nodes.Document doc = Jsoup.parse(html);
            Elements Result = null;
            for (Xpath item : listXpath) {
                if (!item.getisTag()) {
                    Result = doc.getElementsByAttributeValue(item.getTenTag(),
                            item.getTenThuocTinh()).get(item.getSoLuong() - 1).children();
                } else {
                    if (item.isQuetNhieuTag()) {
                        for (int i = item.getTagMin(); i <= item.getTagMax(); i++) {
                            Elements temp = Result.get(i - 1).children();
                            String result = temp.outerHtml();
                            listResult.add(result);
                        }
                    } else {
                        Result = Result.get(item.getSoLuong() - 1).children();
                    }
                }
            }

        } catch (Exception ex) {
        }
        return listResult;
    }

    /**
     * Kiểm tra Xpath có hợp lệ hay không Một XPath đọc gọi là hợp lệ khi và chỉ
     * khi có duy nhất và không có 1 node nào có 2 giá trị Max-Min
     *
     * @param listXpath danh sách các XPath
     * @return true: hợp lệ , false: không hợp lệ
     */
    private boolean KiemTraXpathHopLe(List<Xpath> listXpath) {
        boolean ishople = true;
        try {

            if (listXpath.size() >= 2) {
                for (int i = listXpath.size() - 2; i >= 0; i--) {
                    if (listXpath.get(i).isQuetNhieuTag()) {
                        return false;
                    }
                }
            }
        } catch (Exception ex) {
        }
        return ishople;
    }

    /**
     * Kiểm tra Xpath có phải multi hay không 1 Xpath là multi khi là Xpath hợp
     * lệ và có tag cuối cùng là multi
     *
     * @param listXpath
     * @return
     */
    private boolean KiemTraXpathMulti(List<Xpath> listXpath) {
        boolean multi = false;
        try {
            if (KiemTraXpathHopLe(listXpath)) {
                if (listXpath.get(listXpath.size() - 1).isQuetNhieuTag()) {
                    return true;
                }
            }

        } catch (Exception ex) {
        }
        return multi;
    }
    //<editor-fold desc="kiểm tra 2 chuỗi xem có trùng nhau hay không">

    /**
     * kiểm tra 2 chuỗi xem có trùng nhau hay không
     *
     * @param str1 chuỗi thứ nhất
     * @param str2 chuỗi thứ hai
     * @return k
     */
    //private boolean KiemTraChuoiTrungNhau(String str1, String str2) {
    //  boolean istrungnhau = false;
    //try {
    //} catch (Exception ex) {
    //}
    //return istrungnhau;
    //}
//</editor-fold>
    //<editor-fold desc="Ghi file text">
    /**
     * Ghi file text
     *
     * @param path đường dẫn đến thư mục cần lưu
     * @param list danh sách các chuỗi cần ghi
     */
    //</editor-fold>
    /**
     * kiểm tra 2 chuỗi xem có trùng nhau hay không
     *
     * @param str1 chuỗi thứ nhất
     * @param str2 chuỗi thứ hai
     * @return k
     */
    @Override
    public boolean KiemTraChuoiTrungNhau(String str1, String str2) {
        boolean istrungnhau = false;
        try {
            //chuyển hai chuỗi về cùng 1 dạng là chữ thường.
            String strtemp1 = str1.toLowerCase();
            String strtemp2 = str2.toLowerCase();

            if (strtemp1.compareTo(strtemp2) == 0) {
                istrungnhau = true;
            }
        } catch (Exception ex) {
        }
        return istrungnhau;
    }
//</editor-fold>

    //<editor-fold desc="Ghi file text">
    /**
     * Ghi file text
     *
     * @param path đường dẫn đến thư mục cần lưu
     * @param list danh sách các chuỗi cần ghi
     */
    public void GhiFileText(String path, List<String> list) {
        PrintWriter printWriter = null;
        try {
            // Will overwrite the file if exists or creates new
            printWriter = new PrintWriter(path, "UTF-8");
            for (String item : list) {
                printWriter.println(item);
            }
        } catch (Exception ex) {
        } finally {
            printWriter.close();
        }
    }
    //</editor-fold>
}
